package main

import (
	"fmt"
	"math/rand"
	"sort"
	"strings"
	"time"
)

func main() {
	//1
	s1 := make([]int, 3, 4)
	fmt.Println("修改前的", s1, len(s1), cap(s1), &s1[0])
	s2 := append(s1, 1)
	fmt.Println("才创建的", s2, len(s2), cap(s2), &s2[0])
	//修改s1的元素
	s1[0] = 100
	fmt.Println("修改后的", s1, len(s1), cap(s1), &s1[0])
	fmt.Println("修改后的", s2, len(s2), cap(s2), &s2[0])
	//修改s2的元素
	s2[2] = 100
	fmt.Println("修改后的", s1, len(s1), cap(s1), &s1[0])
	fmt.Println("修改后的", s2, len(s2), cap(s2), &s2[0])
	//s2再增加一个元素
	s2 = append(s2, 100)
	fmt.Println("增加后的", s1, len(s1), cap(s1), &s1[0])
	fmt.Println("增加后的", s2, len(s2), cap(s2), &s2[0])
	fmt.Println(strings.Repeat("=", 40))
	//2、有一个数组 [1,4,9,16,2,5,10,15]，生成一个新切片，要求新切片元素是数组相邻2项的和
	arr := [8]int{1, 4, 9, 16, 2, 5, 10, 15}
	s3 := make([]int, 7) //生成新的一个切片，容量为7，元素长度为7
	for i := 0; i < 7; i++ {
		s3[i] = arr[i] + arr[i+1]
	}
	fmt.Println(s3)
	fmt.Println(strings.Repeat("=", 40))
	//排序
	a := []int{-1, 23, 5, 9, 7}
	//sort.Sort(sort.IntSlice(a)) // sort.IntSlice(a)强制类型转换以施加接口方法
	//sort.Ints(a)   // 就地修改原切片的底层数组
	fmt.Println(a) // 默认升序
	b := []string{"xyz", "a", "abc", "Ab", "X"}
	sort.Strings(b)
	fmt.Println(b)
	sort.Sort(sort.Reverse(sort.IntSlice(a)))
	fmt.Println(a)
	fmt.Println(strings.Repeat("=", 40))
	//随机数
	//rand.Seed(time.Now().Unix())//利用当前时间的纳秒数作为种子
	//src := rand.NewSource(100)，使用种子100创建一个随机数源

	//数字重复统计
	//随机生成100个整数
	//数字的范围[-100, 100]
	//降序输出这些生成的数字并打印其重复的次数
	rand.Seed(time.Now().Unix())
	var numbers []int
	for i := 0; i < 100; i++ {
		numbers = append(numbers, rand.Intn(201)-100) // 随机整数范围[-100, 100]
	}
	//统计次数
	countMap := make(map[int]int)
	for _, num := range numbers {
		countMap[num]++
	}
	//降序排序
	sort.Slice(numbers, func(i, j int) bool {
		return numbers[i] > numbers[j]
	})
	//打印重复次数
	fmt.Print("降序重复次数：")
	for _, num := range numbers {
		count := countMap[num]
		fmt.Printf("%d 重复次数：%d\n", num, count)
	}

}

//1.请问s1、s2内各有什么元素？
//2.s1修改一个元素会影响s2吗？s2修改一个元素会影响s1吗？
//3.s2再增加一个元素会怎么样？
//答1：s1内有3个元素，s2内有4个元素，s1内的元素是0，0，0，s2内的元素是0，0，0，1
//答2：s1修改一个元素会影响s2，s2修改一个元素会影响s1,因为s1和s2指向的是同一个底层数组
//答3：s2再增加一个元素，s2会重新分配一个底层数组，s1不会受到影响

//4、简述线性数据结构和哈希表优劣
//优点：
//简单直观： 线性数据结构的操作相对简单和直观，易于理解和实现。
//内存利用效率： 通常比较节省内存，因为数据元素在内存中是连续存储的。
//缺点：
//查找效率低： 在大规模数据中进行查找时效率较低，需要逐个遍历元素。
//插入和删除效率低： 插入和删除操作可能需要移动大量元素，尤其是对于数组。
//哈希表：
//优点：
//快速查找： 在理想情况下，哈希表可以在常数时间内完成元素的查找。
//高效插入和删除： 插入和删除操作的平均时间复杂度是常数级别。
//适用于大规模数据： 在处理大规模数据时，哈希表可以提供较高的搜索、插入和删除效率。
//缺点：
//空间复杂度： 哈希表可能占用较多的内存，尤其在哈希冲突较多时。
//不适用于有序数据： 哈希表中元素的存储位置是无序的，不适合有序遍历。
